/*
 * @Author: 码农 2646995216@qq.com
 * @Date: 2025-03-18 23:38:44
 * @LastEditors: 码农 2646995216@qq.com
 * @LastEditTime: 2025-03-19 21:53:21
 * @FilePath: /netcomputer/server_tcp.hpp
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include "socket.hpp"
#include <signal.h>
#include <functional>

using namespace std;

typedef function<string(string &package)> func_t;

class TcpServer
{
public:
	// 构造函数
	TcpServer(uint16_t port, func_t callback)
		: _port(port), _callback(callback)
	{
	}

	// 初始化
	bool ServerInit()
	{
		_listensock.Socket();	 // 创建套接字
		_listensock.Bind(_port); // 绑定
		_listensock.Listen();	 // 监听

		return true;
	}

	void ServerStart()
	{
		while (true)
		{
			string clientip;	 // 保存客户端的ip
			uint16_t clientport; // 保存客户端的端口号

			// 等待客户端连接
			int sock = _listensock.Accept(clientip, clientport);
			if (sock < 0)
			{
				cout << "ServerStart Accept false" << endl;
				continue; // 连接失败，重新连接
			}
			cout << "ServerStart Accept success: " << sock << endl;

			// 关闭原来的监听描述符，因为我们已经得到了网络通信描述符
			_listensock.Close();
			string buffer_stream; // 将读取到的字符存入这里

			while (true)
			{
				char buffer[1024];
				int m = read(sock, buffer, sizeof(buffer));//拿到客户端的请求
				if (m > 0)
				{

					buffer[m] = 0;
					buffer_stream += buffer; // 由于我们函数调用传参，都是所以string，所以要将buffer放入buffer_stream
					
					// 打印拿到的客户端信息
					cout << "客户端发来的请求：" << buffer_stream << endl;
					while (true)
					{
						//将请求处理完后，将回应发还给客户端
						string info = _callback(buffer_stream);

						if (info.empty())
							break;
						int w=write(sock, info.c_str(), info.size());
					}
				}
				else
				{
					break;
				}
			}
			sleep(1);
		}
	}

	// 析构函数
	~TcpServer()
	{
	}

private:
	uint16_t _port;
	Sock _listensock;
	func_t _callback;
};